const Koa = require("koa");
const KoaRouter = require("koa-router");
const koabodyparser = require("koa-bodyparser");
const query = require("./mysql.js");

const app = new Koa();
const router = new KoaRouter();

// 作为第一个中间件加载
app.use(koabodyparser());

// 定义接口
// 请求的路径建议是数据表名的复数形式（就是在最后加个 s）
router.post("/invoices", async (ctx) => {
    // 获取请求体参数
    const {
        type,
        name,
        sno = "",
        email = "",
        is_zy,
        is_default,
    } = ctx.request.body;
    console.log({
        type,
        name,
        sno,
        email,
        is_zy,
        is_default,
    });
    // 非空校验
    if (!type || !name) {
        ctx.body = {
            code: 400,
            message: "参数不全",
        };
        return;
    }
    if (type !== "个人" && !sno) {
        ctx.body = {
            code: 400,
            message: "抬头是'企业'或'非企业性单位时'，税号必须填写",
        };
        return;
    }
    // 邮箱校验 531804271@qq.com
    if (email && !/^\w+@[0-9a-z]+\.com$/.test(email)) {
        ctx.body = {
            code: 400,
            message: "请输入正确邮箱",
        };
        return;
    }
    // 是否专用
    if (![0, 1].includes(Number(is_zy))) {
        ctx.body = {
            code: 400,
            message: "是否是专用发票值参数不合法",
        };
        return;
    }
    // 是否默认
    if (![0, 1].includes(Number(is_default))) {
        ctx.body = {
            code: 400,
            message: "是否是默认发票的值不合法",
        };
        return;
    }
    // 发票抬头类型，只能是以下三种类型
    if (!["企业", "非企业性单位", "个人"].includes(type)) {
        ctx.body = {
            code: 400,
            message: "'发票抬头类型只能是：'企业', '非企业性单位', '个人'",
        };
        return;
    }
    // 如果这是默认发票，那么把之前的默认发票给修改了
    if (is_default === 1) {
        await query("update invoice set is_default = 0 where is_default = 1");
    }
    // 保存到数据库
    const res = await query(
        "insert into invoice (type, name, sno, email, is_zy, is_default) values (?, ?, ?, ?, ?, ?)",
        [type, name, sno, email, is_zy, is_default]
    );
    // 判断是否插入成功
    if (res.affectedRows !== 1) {
        ctx.body = {
            code: 500,
            message: "发票添加失败",
        };
        return;
    }
    // 返回成功响应
    ctx.body = {
        code: 201,
        message: "发票添加成功",
    };
});

router.get("/invoices", async (ctx) => {
    // 获取查询参数
    const {} = ctx.query;
    ctx.body = {
        code: 200,
        message: "获取发票列表接口",
    };
});

router.put("/invoices/:id", async (ctx) => {
    // 获取路径参数
    const {} = ctx.params;
    // 从请求体中，获取要修改的信息
    const {} = ctx.request.body;
    // 返回响应
    ctx.body = {
        code: 200,
        message: "修改发票信息接口",
    };
});

router.del("/invoices/:id", async (ctx) => {
    // 获取路径参数
    const {} = ctx.params;
    // 返回响应
    ctx.body = {
        code: 204,
        message: "修改发票信息接口",
    };
});

// 第二个中间件
app.use(router.routes());

app.listen(3000, () => {
    console.log("Koa server running at http://localhost:3000");
});
